package com.chang.product;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/*
 * @Author Changzhenxi
 * @Date 2024/1/2 20:35
 * @Description 整合redis缓存  通过简单实现分布式锁 加锁定时（setnx）解锁（lua脚本）需要原子性操作 获取锁时双重校验 拿锁之前看缓存，拿到锁后再看一次缓存
 * 然后整合redisson进行系统性操作分布式锁
 * 使用springCache作为缓存配置：
 *  1,导入依赖.2,添加application.properties配置文件,设置缓存容器为redis.3,开启缓存,开始使用  缓存注解如下:
 *  @Cacheable 触发将数据保存到缓存的操作
 *  @CacheEvict 触发将数据从缓存删除的操作
 *  @CachePut  不影响方法执行的情况下更新缓存
 *  @Caching  组合以上多个操作
 *  @CacheConfig 在类级别共享缓存的相同配置
 *  4.原理 CacheAutoConfiguration-> RedisCacheConfiguration(注入缓存管理器cacheManager初始化所有缓存)->每个缓存决定时使用什么缓存配置,没有就用默认配置
 *       如果想要更改缓存的配置，只需要给容器中放入一个RedisCacheConfiguration,就会应用到当前cacheManager管理的所有缓存分区中
 *  注意,springCache默认不加锁 可以通过设置@Cacheable(sync = true)来加锁(其他注解没有)
 *   读多写少一致性不高的常规数据完全可以使用springCache  特殊数据则需要额外特殊设计
 */

@EnableRedisHttpSession
@EnableDiscoveryClient
@SpringBootApplication
@EnableTransactionManagement // 开启事务
@EnableFeignClients(basePackages = "com.chang.product.feign")   // 开启远程调用功能
@MapperScan("com.chang.product.mapper")
public class GulimallProductApplication {
    public static void main(String[] args) {
        SpringApplication.run(GulimallProductApplication.class,args);
    }
}
